import { useUserStore } from "@/store/user"
import { getWxOpenId ,wxPhoneLogin} from "@/api"

/**
 * 授权登录相关的 Hook
 * 提供登录状态检查、微信登录、登录确认弹窗等功能
 */
export const useAuth = () => {
  const userStore = useUserStore()

  /**
   * 检查是否已登录
   */
  const isLogined = () => {
    return userStore.isLogined
  }

  /**
   * 微信登录方法
   */
  const wechatLogin = (): Promise<boolean> => {
    return new Promise((resolve, reject) => {
      uni.showLoading({
        title: '登录中...'
      })

      // 获取微信登录code
      uni.login({
        provider: 'weixin',
        success: async (loginRes) => {
          try {
            // 调用微信登录接口
            const result = await getWxOpenId({
              code: loginRes.code
            })

            if (result.success) {
              // 设置token
              userStore.setToken(result.data)
              // 获取用户信息
              await userStore.fetchUserInfo()

              uni.hideLoading()
              uni.showToast({
                title: '登录成功',
                icon: 'success'
              })
              resolve(true)
            } else {
              throw new Error(result.msg || '登录失败')
            }
          } catch (error: any) {
            uni.hideLoading()
            console.error('微信登录失败:', error)
            uni.showToast({
              title: error.message || '登录失败，请重试',
              icon: 'none'
            })
            reject(error)
          }
        },
        fail: (error) => {
          uni.hideLoading()
          console.error('获取微信登录code失败:', error)
          uni.showToast({
            title: '登录失败，请重试',
            icon: 'none'
          })
          reject(error)
        }
      })
    })
  }
  const wePhoneLogin = (data: any) => {
    return new Promise((resolve, reject) => {
      wxPhoneLogin(data).then((res) => {
        if (res.success) {
          userStore.setToken(res.data)
          // 获取用户信息
          userStore.fetchUserInfo()
          resolve(true)
        } else {
          throw new Error(res.msg || '登录失败')
        }
      })
    })
  }
  /**
   * 显示登录确认弹窗
   * @param options 弹窗配置选项
   */
  const showLoginModal = (options: {
    title?: string
    content?: string
    confirmText?: string
    cancelText?: string
  } = {}): Promise<boolean> => {
    const {
      title = '需要登录',
      content = '此功能需要登录后才能使用，是否立即登录？',
      confirmText = '立即登录',
      cancelText = '取消'
    } = options

    return new Promise((resolve) => {
      uni.showModal({
        title,
        content,
        confirmText,
        cancelText,
        success: async (res) => {
          if (res.confirm) {
            try {
              await wechatLogin()
              resolve(true)
            } catch (error) {
              resolve(false)
            }
          } else {
            resolve(false)
          }
        },
        fail: () => {
          resolve(false)
        }
      })
    })
  }

  /**
   * 检查登录状态，如果未登录则显示登录弹窗
   * @param options 弹窗配置选项
   * @returns Promise<boolean> 返回是否已登录（包括弹窗登录成功的情况）
   */
  const checkAuthWithModal = async (options?: {
    title?: string
    content?: string
    confirmText?: string
    cancelText?: string
  }): Promise<boolean> => {
    // 如果已经登录，直接返回 true
    if (isLogined()) {
      return true
    }

    // 未登录，显示登录确认弹窗
    return await showLoginModal(options)
  }

  /**
   * 需要登录的操作装饰器
   * @param action 需要执行的操作
   * @param options 登录弹窗配置
   */
  const requireAuth = async (
    action: () => void | Promise<void>,
    options?: {
      title?: string
      content?: string
      confirmText?: string
      cancelText?: string
    }
  ): Promise<void> => {
    const hasAuth = await checkAuthWithModal(options)
    if (hasAuth) {
      await action()
    }
  }

  /**
   * 退出登录
   */
  const logout = () => {
    userStore.clearUserInfo()
    uni.showToast({
      title: '已退出登录',
      icon: 'success'
    })
  }

  return {
    isLogined,
    wechatLogin,
    showLoginModal,
    checkAuthWithModal,
    requireAuth,
    logout,
    userInfo: userStore.userInfo,wePhoneLogin
  }
}
